home *** CD-ROM | disk | FTP | other *** search
/ PCMania 30 / PCMania CD30.iso / pcmania / graf30 / tacs / cmacros.inc < prev    next >
Text File  |  1987-07-22  |  13KB  |  1,016 lines

  1. comment $
  2. cmacros - assembly macros for interfacing to HHLs
  3. (C)Copyright Microsoft Corp. 1984, 1985
  4. $
  5. if1
  6. ASMpass=1
  7. outif MACRO name,defval,onmsg,offmsg
  8. ifndef name
  9. ifb <defval>
  10. name=0
  11. else
  12. name=defval
  13. endif
  14. endif
  15. if name
  16. name=1
  17. ifnb <onmsg>
  18. %out ! onmsg
  19. endif
  20. else
  21. ifnb <offmsg>
  22. %out ! offmsg
  23. endif
  24. endif
  25. endm
  26. error macro msg
  27. E r r o r ----- msg
  28. endm
  29. %out cMacros Version 2.01 - 6/17/85
  30. outif memS,0,<Small Model>
  31. outif memM,0,<Medium Model>
  32. outif memL,0,<Large Model>
  33. outif memC,0,<Compact Model>
  34. outif memH,0,<Huge Model>
  35. memMOD= memS + memM + memL + memC + memH
  36. if memMOD ne 1
  37. if memMOD eq 0
  38. memS= 1
  39. outif memS,0,<Small Model>
  40. else
  41. error <Must have only 1 memory model selected>
  42. endif
  43. endif
  44. sizeC= memM + memL + memH
  45. sizeD= memL + memC + (memH*2)
  46. outif ?DF,0,<No segments or groups will be defined>
  47. outif ?WIN,1,<Windows Support>
  48. outif ?PLM,1,<PLM calling convention>
  49. ifndef ?NODATA
  50. ?NODATA1=0
  51. else
  52. ?NODATA1=1
  53. %out ! NODATA module
  54. endif
  55. ifndef ?CHKSTK
  56. ?CHKSTK1=0
  57. else
  58. ?CHKSTK1=1
  59. %out ! Stack checking enabled
  60. endif
  61. else
  62. ASMpass=2
  63. endif
  64. .XCREF
  65. .XCREF ?N,?AX,?AH,?AL,?BX,?BH
  66. .XCREF ?BL,?CX,?CH,?CL,?DX,?DH
  67. .XCREF ?DL,?SI,?DI,?ES,?DS,?BP
  68. .XCREF ?SP,?SS,?CS
  69. .XCREF ?RSL,?CPD,?argl,?argc,?BA
  70. .XCREF ?ACB,???,?PO
  71. .XCREF ?PAS,?PC
  72. .XCREF Uconcat,mPush,mPop
  73. .XCREF ?RI,?pp,?pp1,?al1
  74. .XCREF ?aD,?AP,?Atal,?dd,?dd1
  75. .XCREF ?pg,?pg1,?aloc,?cs1,?cs2
  76. .XCREF ?DF,?PLM,?WIN,?IA,?PU,?ADJ
  77. .XCREF ?UF,?RP,?ND,?NODATA1,?CHKSTK1
  78. ?RSL = 0
  79. ?CPD = 0
  80. ?ArgL = 0
  81. ?ArgC = 0
  82. ?BA = 0
  83. ?ACB = 0
  84. ??? = 0
  85. ?PO = 0
  86. ?PAS = 0
  87. ?PC = 0
  88. ?IA = 0
  89. ?PU = 0
  90. ?ADJ = 0
  91. ?RP = 0
  92. ?UF = 0
  93. ?ND = 0
  94. ?N = 0000000000000000B
  95. ?AX = 0000000000000011B
  96. ?AH = 0000000000000001B
  97. ?AL = 0000000000000010B
  98. ?BX = 0000000000001100B
  99. ?BH = 0000000000000100B
  100. ?BL = 0000000000001000B
  101. ?CX = 0000000000110000B
  102. ?CH = 0000000000010000B
  103. ?CL = 0000000000100000B
  104. ?DX = 0000000011000000B
  105. ?DH = 0000000001000000B
  106. ?DL = 0000000010000000B
  107. ?SI = 0000000100000000B
  108. ?DI = 0000001000000000B
  109. ?ES = 0000010000000000B
  110. ?DS = 0000100000000000B
  111. ?BP = 0001000000000000B
  112. ?SP = 0010000000000000B
  113. ?SS = 0100000000000000B
  114. ?CS = 1000000000000000B
  115. .CREF
  116. uconcat macro a,b,c,d,e,f
  117. a&b c&d e&f
  118. endm
  119. mpush macro r
  120. irp x,<ax,bx,cx,dx,si,di,es,ds,bp,sp,ss,cs>
  121. if r AND ?&&x
  122. push x
  123. endif
  124. endm
  125. endm
  126. mpop macro r
  127. irp x,<cs,ss,sp,bp,ds,es,di,si,dx,cx,bx,ax>
  128. if r AND ?&&x
  129. pop x
  130. endif
  131. endm
  132. endm
  133. save macro r
  134. ?RSL=0
  135. ?RI ?RSL,<r>
  136. endm
  137. ?RI macro n,r
  138. irp x,<r>
  139. ifdef ?&&x
  140. n=n OR ?&&x
  141. endif
  142. endm
  143. endm
  144. parmB macro n
  145. ?pp <n>,<byte>,2,1
  146. endm
  147. parmW macro n
  148. ?pp <n>,<word>,2,2
  149. endm
  150. parmD macro n
  151. ife ?PLM
  152. irp x,<n>
  153. ?pp <&&x>,<DWORD>,0,4
  154. ?pp <Off_&&x>,<WORD>,2,2
  155. ?pp <Seg_&&x>,<WORD>,2,2
  156. endm
  157. else
  158. irp x,<n>
  159. ?pp <Seg_&&x>,<WORD>,2,2
  160. ?pp <Off_&&x>,<WORD>,2,2
  161. ?pp <&&x>,<DWORD>,0,4
  162. endm
  163. endif
  164. endm
  165. parmQ macro n
  166. ?pp <n>,<QWORD>,8,8
  167. endm
  168. parmT macro n
  169. ?pp <n>,<TBYTE>,10,10
  170. endm
  171. if sizeC
  172. parmCP macro n
  173. parmD <n>
  174. endm
  175. else
  176. parmCP macro n
  177. parmW <n>
  178. endm
  179. endif
  180. if sizeD
  181. parmDP macro n
  182. parmD <n>
  183. endm
  184. else
  185. parmDP macro n
  186. parmW <n>
  187. endm
  188. endif
  189. ?pp macro n,t,l,s
  190. if ?CPD
  191. .xcref
  192. irp x,<n>
  193. .xcref ?T&&x
  194. ?T&&x=s
  195. ife ?PLM
  196. ?pp1 x,<t>,,,%(?PO+?adj)
  197. ?PO=?PO+l
  198. else
  199. ?PO=?PO+l
  200. ?pp1 x,<t>,%?PO,%?adj
  201. endif
  202. endm
  203. .cref
  204. else
  205. error <Parm(s) "&n" declared outside proc def>
  206. endif
  207. endm
  208. ?pp1 macro n,t,o,a,b
  209. ife ?PLM
  210. n equ t ptr [bp+b]
  211. else
  212. n equ t ptr [bp+a+?PO-o]
  213. endif
  214. endm
  215. ifndef ?NOPARMR
  216. .XCREF
  217. .XCREF ?pr
  218. .CREF
  219. parmR macro n,r,r2
  220. ?pr n,r,r2,%?RP,%(?IA+2)
  221. endm
  222. ?pr macro n,r,r2,i,o
  223. .xcref
  224. ifnb <r2>
  225. parmR SEG_&n,r
  226. parmR OFF_&n,r2
  227. n equ dword ptr [bp-o-2]
  228. .xcref ?T&n
  229. ?T&n=4
  230. else
  231. .xcref ?RP&i
  232. ?RP&i=0
  233. ifdef ?&r
  234. ?RP&i=?&r
  235. endif
  236. if ??? OR (?CPD EQ 0) OR (?RP&i EQ 0)
  237. error <invalid parmR encountered: &n,&r>
  238. exitm
  239. endif
  240. n equ word ptr [bp-o]
  241. ?T&n=2
  242. irp x,<bh,ch,dh,bl,cl,dl,ah,al>
  243. if ?&&x EQ ?&r
  244. n equ byte ptr [bp-o]
  245. ?T&n=1
  246. exitm
  247. endif
  248. endm
  249. ?IA=?IA+2
  250. ?RP=?RP+1
  251. endif
  252. .cref
  253. endm
  254. endif
  255. localB macro n
  256. ?aLoc <n>,<BYTE ptr>,1,1,0
  257. endm
  258. localW macro n
  259. ?aLoc <n>,<WORD PTR>,2,2,1
  260. endm
  261. localD macro n
  262. irp x,<n>
  263. ?aLoc <Seg_&&x>,<WORD PTR>,2,2,1
  264. ?aLoc <Off_&&x>,<WORD PTR>,2,2,1
  265. ?aLoc <&&x>,<DWORD PTR>,0,4,1
  266. endm
  267. endm
  268. localQ macro n
  269. ?aLoc <n>,<QWORD PTR>,8,8,1
  270. endm
  271. localT macro n
  272. ?aLoc <n>,<TBYTE PTR>,10,10,1
  273. endm
  274. if sizeC
  275. localCP macro n
  276. localD <n>
  277. endm
  278. else
  279. localCP macro n
  280. localW <n>
  281. endm
  282. endif
  283. if sizeD
  284. localDP macro n
  285. localD <n>
  286. endm
  287. else
  288. localDP macro n
  289. localW <n>
  290. endm
  291. endif
  292. localV macro n,a
  293. ?aLoc <n>,,%(a),0,1
  294. endm
  295. ?aLoc macro n,t,l,s,a
  296. if ?CPD
  297. .xcref
  298. irp x,<n>
  299. ???=???+l
  300. if a
  301. ???=((??? + 1) AND 0FFFEH)
  302. endif
  303. ?aL1 x,<t>,%(???+?IA)
  304. .xcref ?T&&x
  305. ?T&&x=s
  306. endm
  307. .cref
  308. else
  309. error <Locals "&n" declared outside procedure def>
  310. endif
  311. endm
  312. ?aL1 macro n,t,o
  313. n equ t [bp-o]
  314. endm
  315. ifndef ?NOGLOBAL
  316. globalB macro n,i,s
  317. ?aD <n>,1
  318. ?dd n,1,<BYTE>,<DB>,<i>,<s>
  319. endm
  320. globalW macro n,i,s
  321. ?aD <n>,2
  322. ?dd n,1,<WORD>,<DW>,<i>,<s>
  323. endm
  324. globalD macro n,i,s
  325. ?aD <n>,4
  326. ?dd n,1,<DWORD>,<DD>,<i>,<s>
  327. endm
  328. globalQ macro n,i,s
  329. ?aD <n>,8
  330. ?dd n,1,<QWORD>,<DQ>,<i>,<s>
  331. endm
  332. globalT macro n,i,s
  333. ?aD <n>,10
  334. ?dd n,1,<TBYTE>,<DT>,<i>,<s>
  335. endm
  336. if sizeC
  337. globalCP macro n,i,s
  338. globalD n,<i>,<s>
  339. endm
  340. else
  341. globalCP macro n,i,s
  342. globalW n,<i>,<s>
  343. endm
  344. endif
  345. if sizeD
  346. globalDP macro n,i,s
  347. globalD n,<i>,<s>
  348. endm
  349. else
  350. globalDP macro n,i,s
  351. globalW n,<i>,<s>
  352. endm
  353. endif
  354. endif
  355. ifndef ?NOSTATIC
  356. staticB macro n,i,s
  357. ?aD <n>,1
  358. ?dd n,0,<BYTE>,<DB>,<i>,<s>
  359. endm
  360. staticW macro n,i,s
  361. ?aD <n>,2
  362. ?dd n,0,<WORD>,<DW>,<i>,<s>
  363. endm
  364. staticD macro n,i,s
  365. ?aD <n>,4
  366. ?dd n,0,<DWORD>,<DD>,<i>,<s>
  367. endm
  368. staticQ macro n,i,s
  369. ?aD <n>,8
  370. ?dd n,0,<QWORD>,<DQ>,<i>,<s>
  371. endm
  372. staticT macro n,i,s
  373. ?aD <n>,10
  374. ?dd n,0,<TBYTE>,<DT>,<i>,<s>
  375. endm
  376. if sizeC
  377. staticCP macro n,i,s
  378. staticD n,<i>,<s>
  379. endm
  380. else
  381. staticCP macro n,i,s
  382. staticW n,<i>,<s>
  383. endm
  384. endif
  385. if sizeD
  386. staticDP macro n,i,s
  387. staticD n,<i>,<s>
  388. endm
  389. else
  390. staticDP macro n,i,s
  391. staticW n,<i>,<s>
  392. endm
  393. endif
  394. endif
  395. ?dd macro n,p,t,d,i,s
  396. ife ?PLM
  397. n label t
  398. ?dd1 _&n,p,<d>,<i>,<s>
  399. else
  400. ?dd1 n,p,<d>,<i>,<s>
  401. endif
  402. endm
  403. ?dd1 macro n,p,d,i,s
  404. if p
  405. PUBLIC n
  406. endif
  407. ifb <s>
  408. n d i
  409. else
  410. ifb <i>
  411. n d s DUP (?)
  412. else
  413. n d s DUP (i)
  414. endif
  415. endif
  416. endm
  417. ifndef ?NOEXTERN
  418. .XCREF
  419. .XCREF ?ex1
  420. .CREF
  421. externB macro n
  422. ?ex1 <n>,1,<BYTE>
  423. endm
  424. externW macro n
  425. ?ex1 <n>,2,<WORD>
  426. endm
  427. externD macro n
  428. ?ex1 <n>,4,<DWORD>
  429. endm
  430. externQ macro n
  431. ?ex1 <n>,8,<QWORD>
  432. endm
  433. externT macro n
  434. ?ex1 <n>,10,<TBYTE>
  435. endm
  436. externNP macro n
  437. ?ex1 <n>,2,<NEAR>
  438. endm
  439. externFP macro n
  440. ?ex1 <n>,4,<FAR>
  441. endm
  442. if sizeC
  443. externP macro n
  444. ?ex1 <n>,4,<FAR>
  445. endm
  446. else
  447. externP macro n
  448. ?ex1 <n>,2,<NEAR>
  449. endm
  450. endif
  451. if sizeC
  452. externCP macro n
  453. ?ex1 <n>,4,<DWORD>
  454. endm
  455. else
  456. externCP macro n
  457. ?ex1 <n>,2,<WORD>
  458. endm
  459. endif
  460. if sizeD
  461. externDP macro n
  462. ?ex1 <n>,4,<DWORD>
  463. endm
  464. else
  465. externDP macro n
  466. ?ex1 <n>,2,<WORD>
  467. endm
  468. endif
  469. ?ex1 macro n,s,d
  470. irp x,<n>
  471. .xcref
  472. .xcref ?T&&x
  473. .cref
  474. ?T&&x=s
  475. ife ?PLM
  476. extrn _&&x:&d
  477. x equ _&&x
  478. else
  479. extrn x:&d
  480. endif
  481. endm
  482. endm
  483. endif
  484. ifndef ?NOLABEL
  485. .XCREF
  486. ?lblpu = 0
  487. .XCREF ?lb1,?lblpu
  488. .CREF
  489. labelB macro n
  490. ?lb1 <n>,1,<BYTE>
  491. endm
  492. labelW macro n
  493. ?lb1 <n>,2,<WORD>
  494. endm
  495. labelD macro n
  496. ?lb1 <n>,4,<DWORD>
  497. endm
  498. labelQ macro n
  499. ?lb1 <n>,8,<QWORD>
  500. endm
  501. labelT macro n
  502. ?lb1 <n>,10,<TBYTE>
  503. endm
  504. labelNP macro n
  505. ?lb1 <n>,2,<NEAR>
  506. endm
  507. labelFP macro n
  508. ?lb1 <n>,4,<FAR>
  509. endm
  510. if sizeC
  511. labelP macro n
  512. ?lb1 <n>,4,<FAR>
  513. endm
  514. else
  515. labelP macro n
  516. ?lb1 <n>,2,<NEAR>
  517. endm
  518. endif
  519. if sizeC
  520. labelCP macro n
  521. ?lb1 <n>,4,<DWORD>
  522. endm
  523. else
  524. labelCP macro n
  525. ?lb1 <n>,2,<WORD>
  526. endm
  527. endif
  528. if sizeD
  529. labelDP macro n
  530. ?lb1 <n>,4,<DWORD>
  531. endm
  532. else
  533. labelDP macro n
  534. ?lb1 <n>,2,<WORD>
  535. endm
  536. endif
  537. ?lb1 macro n,s,d
  538. ?lblpu=0
  539. irp x,<n>
  540. ifidn <x>,<PUBLIC>
  541. ?lblpu=1
  542. else
  543. .xcref
  544. .xcref ?T&&x
  545. .cref
  546. ?T&&x=s
  547. ife ?PLM
  548. if ?lblpu
  549. public _&&x
  550. endif
  551. _&&x label &d
  552. x equ _&&x
  553. else
  554. if ?lblpu
  555. public x
  556. endif
  557. x label &d
  558. endif
  559. endif
  560. endm
  561. endm
  562. endif
  563. ifndef ?NODEF
  564. defB macro n
  565. ?aD <n>,1
  566. endm
  567. defW macro n
  568. ?aD <n>,2
  569. endm
  570. defD macro n
  571. ?aD <n>,4
  572. endm
  573. defQ macro n
  574. ?aD <n>,8
  575. endm
  576. defT macro n
  577. ?aD <n>,10
  578. endm
  579. if sizeC
  580. defCP macro n
  581. defD <n>
  582. endm
  583. else
  584. defCP macro n
  585. defW <n>
  586. endm
  587. endif
  588. if sizeD
  589. defDP macro n
  590. defD <n>
  591. endm
  592. else
  593. defDP macro n
  594. defW <n>
  595. endm
  596. endif
  597. endif
  598. ?aD macro n,s
  599. irp x,<n>
  600. .xcref
  601. .xcref ?T&&x
  602. .cref
  603. ?T&&x=s
  604. endm
  605. endm
  606. ifndef ?NOPTR
  607. regPtr macro n,S,O
  608. farPtr n,S,O
  609. endm
  610. farptr macro n,S,O
  611. .xcref
  612. .xcref ?T&n
  613. .cref
  614. n ¯o
  615. push S
  616. push O
  617. &endm
  618. ?T&n=80h
  619. endm
  620. endif
  621. arg macro a
  622. irp x,<a>
  623. ?argc=?argc+1
  624. ?Atal <x>,%?argc
  625. endm
  626. endm
  627. ?Atal macro n,i
  628. .xcref
  629. .xcref ?ALI&i
  630. .cref
  631. ?ALI&i ¯o
  632. ?AP n
  633. &endm
  634. endm
  635. ?AP macro n
  636. ?argl=?argl+2
  637. ifdef ?T&n
  638. ife ?T&n-1
  639. push word ptr (n)
  640. exitm
  641. endif
  642. ife ?T&n-2
  643. push n
  644. exitm
  645. endif
  646. ife ?T&n-4
  647. push word ptr (n)+2
  648. push word ptr (n)
  649. ?argl=?argl+2
  650. exitm
  651. endif
  652. ife ?T&n-8
  653. push word ptr (n)+6
  654. push word ptr (n)+4
  655. push word ptr (n)+2
  656. push word ptr (n)
  657. ?argl=?argl+6
  658. exitm
  659. endif
  660. if ?T&n AND 80h
  661. n
  662. ?argl=?argl+2
  663. exitm
  664. endif
  665. ife ?T&n
  666. push word ptr (n)
  667. exitm
  668. endif
  669. endif
  670. push n
  671. endm
  672. ife ?PLM
  673. ccall macro n,a,sleaze
  674. ifnb <a>
  675. Arg <a>
  676. endif
  677. mpush %?RSL
  678. ?argl=0
  679. ?ACB=?argc
  680. rept ?argc
  681. uconcat <?ALI>,%?ACB
  682. uconcat <purge>,,<?ALI>,%?ACB
  683. ?ACB=?ACB-1
  684. endm
  685. ifb <sleaze>
  686. call _&n
  687. else
  688. call n
  689. endif
  690. if ?argl
  691. add sp,?argl
  692. endif
  693. mpop %?RSL
  694. ?RSL=0
  695. ?argc= 0
  696. ?argl= 0
  697. endm
  698. else
  699. ccall macro n,a
  700. ifnb <a>
  701. Arg <a>
  702. endif
  703. mpush %?RSL
  704. ?argl=0
  705. ?ACB=1
  706. rept ?argc
  707. uconcat <?ALI>,%?ACB
  708. uconcat <purge>,,<?ALI>,%?ACB
  709. ?ACB=?ACB+1
  710. endm
  711. call n
  712. mpop %?RSL
  713. ?RSL=0
  714. ?argc=0
  715. ?argl=0
  716. endm
  717. endif
  718. cProc macro n,c,a,f
  719. if ?CPD
  720. ?UTPE
  721. endif
  722. ?CPD=1
  723. ???=0
  724. ?argc=0
  725. ?BA=0
  726. ?PO=0
  727. ?PU=0
  728. ?IA=0
  729. ?adj=4
  730. ?PC=0
  731. ?RP=0
  732. ?UF=0
  733. ?PAS=0
  734. ifnb <a>
  735. ?RI ?PAS,<a>
  736. endif
  737. ?PC=sizeC
  738. ?ND=?NODATA1
  739. irp x,<c>
  740. ifidn <x>,<FAR>
  741. ?PC=1
  742. endif
  743. ifidn <x>,<NEAR>
  744. ?PC=0
  745. endif
  746. ifidn <x>,<PUBLIC>
  747. ?PU=1
  748. endif
  749. ifidn <x>,<SMALL>
  750. ?UF=1
  751. endif
  752. ifidn <x>,<DATA>
  753. ?ND=0
  754. endif
  755. ifidn <x>,<NODATA>
  756. ?ND=1
  757. endif
  758. endm
  759. if ?PC
  760. if ?WIN
  761. ?IA=2
  762. if (?PAS AND ?ds)
  763. if ?ND
  764. ?ND = 2
  765. endif
  766. ?PAS = ?PAS AND (NOT ?ds)
  767. endif
  768. endif
  769. ?adj=?adj+2
  770. endif
  771. ?PAS = ?PAS AND (NOT (?sp+?cs+?ss))
  772. if ?UF
  773. ?PAS = ?PAS AND (NOT (?bp+?si+?di))
  774. endif
  775. ife ?PLM
  776. ife ?PC
  777. n label near
  778. else
  779. n label far
  780. endif
  781. ?pg <_&n>,%?PU,%?PC,%?PAS,%?IA
  782. else
  783. ?pg <n>,%?PU,%?PC,%?PAS,%?IA
  784. endif
  785. endm
  786. ?pg macro n,p,c,a,w
  787. .xcref
  788. if ?UF
  789. if ?RP
  790. error <parmR encountered in &n - user frame ignored>
  791. ?UF=0
  792. endif
  793. if ?ND
  794. error <NODATA encountered in &n - user frame ignored>
  795. ?UF=0
  796. endif
  797. endif
  798. cBegin ¯o g
  799. .xcref
  800. ?pg1 <n>,c,a,%?PO,w,%?UF,%?ND,%?RP
  801. ?CPD=0
  802. ?argc=0
  803. ?BA=1
  804. ???=(???+1) AND 0FFFEH
  805. if p
  806. PUBLIC n
  807. endif
  808. ife c
  809. n proc NEAR
  810. else
  811. n proc FAR
  812. endif
  813. ifidn <g>,<nogen>
  814. if ???+?PO+a+?RP
  815. %out <cBegin - possible invalid use of nogen>
  816. endif
  817. else
  818. if ?UF
  819. ?MF c,%???,%?PO
  820. mPush a
  821. else
  822. if w
  823. ife ?ND
  824. mov ax,ds
  825. nop
  826. endif
  827. inc bp
  828. push bp
  829. mov bp,sp
  830. push ds
  831. ife ?ND
  832. mov ds,ax
  833. endif
  834. else
  835. if ???+?PO+?RP
  836. push bp
  837. mov bp,sp
  838. endif
  839. endif
  840. if ?RP
  841. ?UF=0
  842. rept ?RP
  843. uconcat mpush,,?RP,%?UF
  844. ?UF=?UF+1
  845. endm
  846. endif
  847. if ???
  848. if ?CHKSTK1
  849. mov ax,???
  850. ife ?PLM
  851. call _chkstk
  852. else
  853. call chkstk
  854. endif
  855. else
  856. sub sp,???
  857. endif
  858. endif
  859. mPush a
  860. endif
  861. endif
  862. .cref
  863. purge cBegin
  864. &endm
  865. ?UTPE ¯o
  866. error <Unterminated Procedure Definition: "&n">
  867. &endm
  868. endm
  869. ?pg1 macro n,c,a,o,w,f,d,r
  870. .xcref
  871. cEnd ¯o g
  872. .xcref
  873. ?BA=0
  874. ifidn <g>,<nogen>
  875. if o+a+r
  876. %out <cEnd - possible invalid use of nogen>
  877. endif
  878. else
  879. if f
  880. mPop a
  881. db 0C3h
  882. else
  883. mPop a
  884. if w
  885. sub bp,2
  886. mov sp,bp
  887. pop ds
  888. pop bp
  889. dec bp
  890. else
  891. if ???+?PO+?RP
  892. mov sp,bp
  893. pop bp
  894. endif
  895. endif
  896. ife ?PLM
  897. ret
  898. else
  899. ret o
  900. endif
  901. endif
  902. endif
  903. n endp
  904. .cref
  905. purge cEnd
  906. &endm
  907. .cref
  908. endm
  909. assumes macro s,ln
  910. ifndef ln&_assumes
  911. assume s:ln
  912. else
  913. ln&_assumes s
  914. endif
  915. endm
  916. createSeg macro n,ln,a,co,cl,grp
  917. ifnb <grp>
  918. addSeg grp,n
  919. else
  920. ln&OFFSET equ OFFSET n:
  921. ln&BASE equ n
  922. ?cs3 <ln>,<n>
  923. endif
  924. ifnb <cl>
  925. n segment a co '&cl'
  926. else
  927. n segment a co
  928. endif
  929. n ends
  930. ?cs1 <ln>,<n>
  931. endm
  932. addSeg macro grp,seg
  933. ifndef grp&_def
  934. grp&_def=0
  935. endif
  936. if grp&_def ne ASMpass
  937. grp&_add ¯o s
  938. grp&_in <seg>,s
  939. &endm
  940. grp&_in ¯o sl,s
  941. ifb <s>
  942. grp group sl
  943. else
  944. grp&_add ¯o ns
  945. grp&_in <sl,s>,ns
  946. &endm
  947. endif
  948. &endm
  949. grp&_def=ASMpass
  950. else
  951. grp&_add seg
  952. endif
  953. endm
  954. defGrp macro grp,ln
  955. addSeg grp
  956. ifnb <ln>
  957. ?cs3 <ln>,<grp>
  958. ln&OFFSET equ OFFSET grp:
  959. ln&BASE equ grp
  960. endif
  961. endm
  962. ?cs1 macro ln,n
  963. ln&_sBegin ¯o
  964. ?MF &¯o c,l,p
  965. if c
  966. extrn n&_FARFRAME:near
  967. call n&_FARFRAME
  968. else
  969. extrn n&_NEARFRAME:near
  970. call n&_NEARFRAME
  971. endif
  972. db l shr 1
  973. db p shr 1
  974. &&endm
  975. ?cs2 <ln>,<n>
  976. n segment
  977. &endm
  978. endm
  979. ?cs2 macro ln,n
  980. sEnd ¯o
  981. n ends
  982. purge ?MF
  983. &endm
  984. endm
  985. ?cs3 macro ln,n
  986. ln&_assumes ¯o s
  987. assume s:&n
  988. &endm
  989. endm
  990. sBegin macro ln
  991. ln&_sBegin
  992. endm
  993. ife ?DF
  994. createSeg _TEXT,code,byte,public,CODE
  995. ife ?NODATA1
  996. createSeg _DATA,data,word,public,DATA,DGROUP
  997. defGrp DGROUP,DATA
  998. endif
  999. if ?CHKSTK1
  1000. externP <chkstk>
  1001. endif
  1002. endif
  1003. errnz macro x
  1004. if2
  1005. if x
  1006. errnz1 <x>,%(x)
  1007. endif
  1008. endif
  1009. endm
  1010. errnz1 macro x1,x2
  1011. = *ERRNZ* x1 = x2
  1012. endm
  1013. errn$ macro l,x
  1014. errnz <OFFSET $ - OFFSET l x>
  1015. ENDM
  1016.